home *** CD-ROM | disk | FTP | other *** search
- /* CD.DEVICE TEST (AUDIO) */
-
- /**************************************************************************
- * *
- * This script has been written to test the cd.device on the Amiga CD-32 *
- * *
- * Its purpose is to test the cd.device as it relates to playing audio. *
- * Please use Data.cd to test data related commands. *
- * *
- * Author: Michael McLaughlin (mikemc@hydrogen) [Drexel Co-op student] *
- * *
- **************************************************************************/
-
- Address CD.1 /* Reference to cd.device test program */
- OPTIONS RESULTS /* Allow results */
-
- INFO initial /* Makes sure this doesn't run w/o a disc */
- if (initial.Spin = 0) | (initial.CDROM ~= 0) then do;
- say
- say 'Please insert AUDIO disk (CD-DA) before beginning the CD.DEVICE test.'
- say
- exit
- end;
-
- /* Constants */
- framesPerSec = 75 /* Frames per second */
-
- /**************************************************************************/
-
- /* LSN TOC */
- say
- say "LSN [Logical Sector Number] TOC test"
- say
-
- TOCLSN lTOC 100 0 /* Read TOC with summary */
-
- lsnEOD = lTOC.Summary.LeadOut
- finalTrack = lTOC.Summary.LastTrack
-
- say /* Display TOC */
- say 'Summary: FirstTrack= ' lTOC.Summary.FirstTrack
- say ' LastTrack= ' lTOC.Summary.LastTrack
- say ' LeadOut= ' lsnEOD
- say
-
- say 'Track No. Track Pos. Control Byte'
- say '--------- ---------- ------------'
-
- do trck = 1 to lTOC.Summary.LastTrack
- say center(lTOC.trck.Track,9) right(lTOC.trck.Position,9) right(lTOC.trck.CtlAdr,9)
- master.trck.Track = lTOC.trck.Track
- master.trck.Position = lTOC.trck.Position
- mAster.trck.CtlAdr = lTOC.trck.CtlAdr
- end
-
- /* MSF TOC */
- say
- say
- say "MSF [Minute/Second/Frame] TOC test"
- say
-
- TOCMSF mTOC 100 0 /* Read TOC with summary */
-
- msfEOD = toMSFform(mTOC.Summary.LeadOut.Minute, mTOC.Summary.LeadOut.Second, mTOC.Summary.LeadOut.Frame)
-
- say /* Display TOC */
- say 'Summary: FirstTrack= ' mTOC.Summary.FirstTrack
- say ' LastTrack= ' mTOC.Summary.LastTrack
- say ' LeadOut= ' msfEOD
- say
-
- say 'Track No. Track Pos. Control Byte'
- say '--------- ---------- ------------'
-
- do trck = 1 to mTOC.Summary.LastTrack
- potion = toMSFform(mTOC.trck.Position.Minute, mTOC.trck.Position.Second, mTOC.trck.Position.Frame)
- mCopy.trck.Track = mTOC.trck.Track
- mCopy.trck.Position = potion
- mCopy.trck.CtlAdr = mTOC.trck.CtlAdr
- say center(mTOC.trck.Track,9) center(potion,12) center(mTOC.trck.CtlAdr,12)
- end
-
-
- /**************************************************************************/
-
- /* LSN and MSF Comparisons */
- say
- say
- say 'Differences between the LSN and the MSF specifications (LSN format)'
- say
-
- say 'Track No. LSN Track Pos. MSF Track Pos. LSN Ctrl Byte MSF Ctrl Byte'
- say '--------- -------------- -------------- ------------- -------------'
- do trck = 1 to mTOC.Summary.LastTrack
- mPos = msf2sec(mCopy.trck.Position) * 75
- mPos = trunc(mPos - (msf2sec(mCopy.1.Position) * 75))
- lPos = master.trck.Position
- say center(trck,9) right(lPos,11) right(mPos,15) right(master.trck.CtlAdr,12) right(mCopy.trck.CtlAdr,14)
- end
-
-
- /* Comparison btw Master TOC and individual TOC */
- say
- say
- say 'Summary Verification'
- say
- do trck = 1 to 99 while substr(Master.trck.Track,1,1) ~= 'M'
- end
- tracks = trck - 1
- say 'There are' tracks 'tracks on this disk.'
- if tracks = finalTrack then say 'This agrees with the summary data.'
- else say 'The summary and the actual track information are in conflict!'
- say
- say
-
- /**************************************************************************/
-
- say 'Enter the Audio Play test? [LSN] (y n a q ?)'
- pull goOn
- if goOn = ? then do;
- say
- say ' y = Yes'
- say ' n = No'
- say ' a = All tests'
- say ' q = Quit this script'
- say
- pull goOn
- end;
- if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
-
- /* Audio Play (LSN Format) */
- say
- say 'LSN Audio Play test'
- say
-
- segTime = 30 * framesPerSec /* Sets play duration */
-
- say 'Playing 30-second segment at beginning of disk.'
- PLAYLSN 0 segTime
-
- say 'Playing 30-second segment at end of disk.'
- start = lsnEOD - segTime - 1
- PLAYLSN start segTime
-
- say 'Playing 30-second segment span between tracks 1 and 2.'
- start = lTOC.2.Position - segTime % 2
- PLAYLSN start segTime /* Span 30 secs btw tracks 1 & 2 */
-
- /* NOTE: cd.device does not allow play after end of disc marker. */
-
- say 'Playing 150-frame segment'
- PLAYLSN 1125 150 /* Play 150 frame segment */
-
- say 'Playing six 150-frame segments randomly distributed through disk.'
- do seg = 1 to 6
- say ' Segment' seg
- newEOD = lsnEOD % 400
- start = RANDOM(2, newEOD, right(time('S'),2)) * 400
- PLAYLSN start 150 /* Play 6 random 150 frame segments */
- end
-
- end;
-
- /**************************************************************************/
-
- if (goOn ~= Q) & (goOn ~= A) then do
- say 'Enter the Audio Play test? [MSF] (y n q)'
- pull goOn
- end
- if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
-
- /* Audio Play (MSF Format) */
- say
- say 'MSF Audio Play test'
- say
-
- segTime = "00:30:00" /* Sets play duration */
-
- say 'Playing 30-second segment at beginning of disk.'
- start = sec2msf(mTOC.1.Position.Second + (mTOC.1.Position.Frame + 1) / 75)
- PLAYMSF start segTime /* start is starting point of audio play */
-
- say 'Playing 30-second segment at end of disk.'
- start = sec2msf(msf2sec(msfEOD) - msf2sec(segTime) - (1/75))
- PLAYMSF start segTime
-
- say 'Playing 30-second segment span between tracks 1 and 2.'
- potion = toMSFform(mTOC.2.Position.Minute, mTOC.2.Position.Second, mTOC.2.Position.Frame)
- start = sec2msf(msf2sec(potion) - (msf2sec(segTime) / 2))
- PLAYMSF start segTime /* Span 30 secs btw tracks 1 & 2 */
-
- /* NOTE: cd.device does not allow play after end of disk marker. */
-
- say 'Playing 2-second segment'
- PLAYMSF "00:15:00" "00:02:00" /* Play 2 seconds */
-
- say 'Playing six 2-second segments randomly distributed through disk.'
- do seg = 1 to 6
- say ' Segment' seg
- newEOD = msf2sec(msfEOD) % 4.9 /* Scale range to use RANDOM fnctn */
- start = sec2msf(RANDOM(2, newEOD, right(time('S'),2)) * 4.9) /* De-scale*/
- PLAYMSF start "00:02:00" /* Play 6 random 2 second segments */
- end
-
- end;
-
- /**************************************************************************/
-
- if (goOn ~= Q) & (goOn ~= A) then do
- say 'Enter the Audio Play Track test? (y n q)'
- pull goOn
- end
- if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
-
- /* Audio Play (Track) */
- say
- say 'Audio Play Track test'
- say
-
- say 'Playing first track'
- PLAYTRACK 1 1 /* Play only the first track */
-
- say 'Playing last track'
- PLAYTRACK finalTrack 1 /* Play only the last track */
-
- say 'Playing all tracks of the disk'
- PLAYTRACK 1 finalTrack /* Play all the tracks */
-
- say 'Attempting to play track beyond end of disk'
- futile = finalTrack + 1
- PLAYTRACK futile 1 /* Attempt to play one track past the last track */
-
- /* Note: cd.device does not allow play after the end of disk marker. */
-
- end;
-
- /**************************************************************************/
-
- if (goOn ~= Q) & (goOn ~= A) then do
- say 'Enter the Audio Play Search test? (y n q)'
- pull goOn
- end
- if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
-
- /* Audio Play (Search) */
- say
- say 'Audio Play Search test'
- say
-
- SEARCH NORMAL /* Set search-mode to normal setting */
- call tellSearch /* Reports on search-speed via INFO cmd */
-
- segTime = 120 * framesPerSec /* Sets play duration */
-
- say 'Playing 2-minute segment at middle of disk.'
- start = lsnEOD % 2 - segTime % 2
- PLAYLSN start segTime
-
- SEARCH FFWD /* Set search-mode to fast-forward setting */
- call tellSearch
-
- say 'Playing 2-minute segment at middle of disk.'
- start = lsnEOD % 2 - segTime % 2
- PLAYLSN start segTime
-
- say 'Playing 2-minute segment at end of disk.'
- start = lsnEOD - segTime - 1
- PLAYLSN start segTime
-
- SEARCH FREV /* Set search-mode to fast-reverse setting */
- call tellSearch
-
- say 'Playing 2-minute segment at middle of disk.'
- start = lsnEOD % 2 - segTime % 2
- PLAYLSN start segTime
-
- say 'Playing 2-minute segment at end of disk.'
- start = lsnEOD - segTime - 1
- PLAYLSN start segTime
-
- SEARCH NORMAL /* Set search-mode back to normal setting */
- call tellSearch;
-
- end;
-
- /**************************************************************************/
-
- if (goOn ~= Q) & (goOn ~= A) then do
- say 'Enter the Audio Play Pause test? (y n q)'
- pull goOn
- end
- if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
-
- /* Audio Play (Pause) */
- say
- say 'Audio Play Pause test'
- say
-
- Address command
- 'run rx AudioPause.rexx' /* Call other script to pause play */
- Address CD.1
-
- segTime = 30 * framesPerSec /* Sets play duration */
-
- say 'Playing 30-second segment at middle of disk.'
- start = lsnEOD % 2 - segTime % 2
- PLAYLSN start segTime
-
- SEARCH FFWD
- call tellSearch
-
- segTime = 150 * framesPerSec /* Sets play duration */
-
- say 'Playing 2-minute segment at middle of disk.'
- start = lsnEOD % 2 - segTime % 2
- PLAYLSN start segTime
-
- SEARCH FREV
- call tellSearch
-
- say 'Playing 2-minute segment at middle of disk.'
- start = lsnEOD % 2 - segTime % 2
- PLAYLSN start segTime
-
- SEARCH NORMAL
- call tellSearch
-
- end;
-
- /**************************************************************************/
-
- if (goOn ~= Q) & (goOn ~= A) then do
- say 'Enter the Audio Play Attenuate test? (y n q)'
- pull goOn
- end
- if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
-
- /* Attentuate */
- say
- say 'Audio Play Attentuate test'
- say
-
- Address command 'run rx AudioPlay.rexx' (4 * framesPerSec) lsnEOD
- Address CD.1
-
- segTime = 16 * framesPerSec /* Duration of fade */
-
- call delay(4) /* Delay until music begins */
-
- say 'Attempting to fade into mute'
- ATTENUATE segTime 0
-
- say 'Attempting to fade into full volume'
- ATTENUATE segTime 32767
-
- /* Note: The CD-32 ignores the fade because it's on/off, no in-betweens */
-
- if (goOn = A) then call delay(2) /* Waits for audio to finish */
- say
-
- end;
-
- /**************************************************************************/
-
- if (goOn ~= Q) & (goOn ~= A) then do
- say 'Enter the Q-Code test? (y n q)'
- pull goOn
- end
- if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
-
- /* Q-Code */
-
- /* LSN Format */
-
- say 'Q-Code test in LSN format'
-
- if ~open('temp','RAM:Temp.txt','w') then do /* Open temporary txt file */
- say "Can't open file:" "RAM:Temp.txt"
- exit 20
- end
-
- Address command 'run rx AudioPlay.rexx' (32 * framesPerSec) lsnEOD
- Address CD.1
-
- call delay(2) /* Delay until music begins */
-
- call writeln('temp', 'Q-Code listing in LSN format:')
- call writeln('temp', ' ')
- call writeln('temp', 'Track # Index # Track Pos. Disk Pos.')
- call writeln('temp', '------- ------- ---------- ---------')
-
- call time 'R'
- do cnt = 1 until time('E') > 30
- QCODELSN thisDisk
- track.cnt = thisDisk.Track
- index.cnt = thisDisk.Index
- trackPos.cnt = thisDisk.TrackPosition
- diskPos.cnt = thisDisk.DiskPosition
- end
-
- maxQCode = cnt - 1
-
- say 'Please be patient, storing Q-Code values into text file for viewing.'
-
- do cnt = 1 to maxQCode
- call writech('temp', ' '||track.cnt||' ')
- call writech('temp', index.cnt||' ')
- call writech('temp', trackPos.cnt||' ')
- call writeln('temp', diskPos.cnt)
- end
-
- call close('temp')
-
- Address command 'more RAM:Temp.txt'
- Address CD.1
-
- /* MSF Format */
-
- say 'Q-Code test in MSF format'
-
- if ~open('temp','RAM:Temp.txt','w') then do
- say "Can't open file:" "RAM:Temp.txt"
- exit 20
- end
-
- Address command 'run rx AudioPlay.rexx' (32 * framesPerSec) lsnEOD
- Address CD.1
-
- call delay(2) /* Delay until music begins */
-
- call writeln('temp', 'Q-Code listing in MSF format:')
- call writeln('temp', ' ')
- call writeln('temp', 'Track # Index # Track Pos. Disk Pos.')
- call writeln('temp', '------- ------- ---------- ---------')
-
- call time 'R'
- do cnt = 1 until time('E') > 30
- QCODEMSF thisDisk
- track.cnt = thisDisk.Track
- index.cnt = thisDisk.Index
- trackPosM.cnt = thisDisk.TrackPosition.Minute
- trackPosS.cnt = thisDisk.TrackPosition.Second
- trackPosF.cnt = thisDisk.TrackPosition.Frame
- diskPosM.cnt = thisDisk.DiskPosition.Minute
- diskPosS.cnt = thisDisk.DiskPosition.Second
- diskPosF.cnt = thisDisk.DiskPosition.Frame
- end
-
- maxQCode = cnt - 1
-
- say 'Please be patient, storing Q-Code values into text file for viewing.'
-
- do cnt = 1 to maxQCode
- call writech('temp', ' '||track.cnt||' ')
- call writech('temp', index.cnt||' ')
- trackPos = toMSFform(trackPosM.cnt, trackPosS.cnt, trackPosF.cnt)
- call writech('temp', trackPos||' ')
- diskPos = toMSFform(diskPosM.cnt, diskPosS.cnt, diskPosF.cnt)
- call writeln('temp', diskPos)
- end
-
- call close('temp')
-
- Address command 'more RAM:Temp.txt'
- Address command 'delete >nil: RAM:Temp.txt'
- Address CD.1
- say
-
- end;
-
- /**************************************************************************/
-
- if (goOn ~= Q) & (goOn ~= A) then do
- say 'Enter the Frame Interrupt test? (y n q)'
- pull goOn
- end
- if ~((goOn ~= Y) | (goOn = Q)) | (goOn = A) then do;
-
- /* Frame Interrupt */
- say
- say 'Frame Interrupt test'
- say
-
- say 'Adding frame interrupt.'
- ADDFRAMEINT /* Add frame interrupt */
-
- segTime = 30 * framesPerSec /* Sets play duration */
-
- say 'Playing 30-second segment at middle of disk.'
- start = lsnEOD % 2 - segTime % 2
- PLAYLSN start segTime
-
- say 'Removing frame interrupt.'
- REMFRAMEINT /* Remove frame interrupt */
-
- say 'Getting frame interrupt data.'
- GETFRAMEINT frameData /* Get frame interrupt data */
-
- say 'Actual calls to frame interrupt handler is' frameData.Call
- say 'Expected calls to frame interrupt handler is' segTime
-
- pError = ((frameData.Call - segTime) / segTime) * 100 /* Calculation */
- if pError >= 0 then playError = trunc(pError * 100 + 0.5) / 100 /*Rounding*/
- else playError = trunc(pError * 100 - 0.5) / 100
- if playError > 0 then playError = '+'||playError /* Add sign */
- say 'Margin of error is' playError'%'
-
- say 'Number of calls to frame interrupt handler with bad interrupt data is' frameData.BadData
-
- end;
-
- say
- QUIT /* Quits from CDtest */
- exit /* Exit from the script */
-
- /***** FUNCTIONS **********************************************************/
-
- tellSearch: procedure /* Outputs search status */
- INFO thisDisk
- if thisDisk.Search = 0 then say 'Search is set at Normal play'
- else if thisDisk.Direction = 0 then say 'Search is set at Fast-Forward play'
- else say 'Search is set at Fast-Reverse play'
- return
-
- delay: procedure /* Pauses for a specified no. of seconds */
- arg timeindex
- call time 'R'
- do until time('E') >= timeindex
- end
- return
-
- formt: /* Formats 2-digit numbers */
- arg oldnum
- if oldnum <= 9 then newnum = '0'||oldnum
- else newnum = oldnum
- return newnum
-
- toMSFform: /* Converts mm, ss, and ff into mm:ss:ff */
- arg min, sec, frm
- combo = formt(min) || ':' || formt(sec) || ':' || formt(frm)
- return combo
-
- msf2sec: /* Converts MSF format to seconds */
- arg msfForm
- min = substr(msfForm,1,2) /* First 2 characters of string msfForm */
- sec = substr(msfForm,4,2) /* Middle 2 characters of string msfForm */
- frm = substr(msfForm,7,2) /* Last 2 characters of string msfForm */
- totsec = (min * 60) + sec + (frm / 75) /* Convert to seconds */
- return totsec
-
- sec2msf: /* Converts seconds to MSF format */
- arg totsec
- min = trunc(totsec / 60)
- sec = trunc(totsec - min * 60)
- frm = trunc((totsec - min * 60 - sec) * 75)
- msfForm = toMSFform(min, sec, frm)
- return msfForm
-
- trunc: /* Deletes decimal point and numbers to the right of it */
- arg oldnum
- key = index(oldnum||'.', '.') /* Finds position of dec point */
- newnum = delstr(oldnum, key) /* Only keeps what's left of dec point */
- return newnum
-